﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using System.Drawing;
using System.IO;
using DAL.Repositorios;
using DAL.RepositoryInterfaces;

namespace DAL.Repositorios
{
    public class ClienteRepository : IClientesRepository
    {

        

        public IEnumerable<Cliente> GetAll()
        {

            DataSet ds = UsuarioManRepository.GetDataSetGenerico('C', DBNull.Value);

            foreach (DataRow dr in ds.Tables[0].Rows)
                yield return crearCliente(Convert.ToInt32(dr["IdUsuario"]), dr);

        }

        public IEnumerable<Cliente> ClientesConsultarClientesConPlan()
        {

            SqlCommand cmd = new SqlCommand();
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaListarClientesConPE");
       

            foreach (DataRow dr in ds.Tables[0].Rows)
                yield return crearCliente(Convert.ToInt32(dr["IdUsuario"]), dr);

        }

        public Cliente GetById(int id)
        {
            Cliente objCliente = null;
            DataSet ds = UsuarioManRepository.GetDataSetGenerico('C', id);

            foreach (DataRow dr in ds.Tables[0].Rows) 
                objCliente = crearCliente(id, dr);


            return objCliente;

        }

        internal static Cliente crearCliente( int id, DataRow dr){
            
        
            object foto= dr["Foto"];
            Rol rol= RolRepository.crearRol(Convert.ToInt32(dr["IdRol"]), dr);
            var peRepo= (PlanEntrenamientoRepository)UnitOfWork.RepositoryPlanE;

            Cliente objCliente = new Cliente(
                idUsuario: id,
                identificacion: dr["Identificacion"].ToString(),
                nombre: dr["Nombre"].ToString(),
                PApellido: dr["PApellido"].ToString(),
                SApellido: dr["SApellido"].ToString(),
                fechaNacimiento: Convert.ToDateTime(dr["FechaNacimiento"]),
                fechaIngreso: Convert.ToDateTime(dr["FechaIngreso"]),
                genero: (Genero)Convert.ToChar(dr["Genero"]),
                foto: foto!=DBNull.Value?((byte[])foto).toBitMap(): null,
                alias: dr["ALIAS"].ToString(),
                nombreUsuario: dr["NombreUsuario"].ToString(),
                rol: rol,
                nacionalidad: dr["NombrePais"].ToString(),
                discripcionTipoId: dr["DescTipoID"].ToString(),
                estado: (EstadoUsuario)Convert.ToChar(dr["Estado"]),
                listaCorreos: new Lazy<IList<CorreoElectronico>>(()=>{ 
                    return CorreoElectronicoRepository.correosDeUsuario(id); 
                }),
                listaTelefonos: new Lazy<IList<Telefono>>(() => {
                    return TelefonoUsuarioRepository.telefonosDeUsuario(id); 
                }),
                listaPagos: new Lazy<IList<Pago>>(()=>{
                    return PagoRepository.PagoCliente(id);
                }),
                listaReferencias: new Lazy<IList<Referencia>>(()=>{
                    return ReferenciaRepository.ReferenciasUsuario(id);
                }),
                listaPlanes: new Lazy<IList<PlanEntrenamiento>>(
                    ()=>peRepo.consultarPlanesDeCliente(id))
                

                );

            return objCliente;
        }




     
    }
}
